#include "Bouton.h"



Bouton::Bouton(char texteN[] , char *police)
{
    texte = texteN;
    click = false;
    size = 35;
    this->police = police;
    init();

	SurfacefondOut = NULL;
    SurfacefondIn = NULL;
    SurfacefondAct = NULL;
}

Bouton::Bouton(char texteN[], char *police , int s)
{
    texte = texteN;
    size = s;
    this->police = police;

    init();

    SurfacefondOut = NULL;
    SurfacefondIn = NULL;
    SurfacefondAct = NULL;
}

Bouton::Bouton(char texteB[] , char *police,  FondBouton * fondout , FondBouton *fondin)
{
    size = 35;
    texte = texteB;
    click = false;
    this->police = police;

    init();

	SurfacefondOut = NULL;
    SurfacefondIn = NULL;
    SurfacefondAct = NULL;

	setFondIn(fondin);
    setFondOut(fondout);

    SurfacefondAct = SurfacefondOut;
}

//bouton pour lequel on indique la taille de la police
Bouton::Bouton(char texteB[] , char *police , int s , FondBouton *fondout , FondBouton *fondin )
{
    size = s;
    texte = texteB;
    this->police = police;
    
    init();

	SurfacefondOut = NULL;
    SurfacefondIn = NULL;
    SurfacefondAct = NULL;

	setFondIn(fondin);
    setFondOut(fondout);

    SurfacefondAct = SurfacefondOut;
}

void Bouton::init()
{
    click = false;

    in.b = in.g = out.r = out.b = out.g  = 0;
    in.r = 255;

    if(texte != NULL && texte[0] != '\0')
        policeTTF = TTF_OpenFont(this->police, size);
    else
        policeTTF = NULL;

    textIn = NULL;
    textOut = NULL;
    SurfacefondIn = NULL;
    SurfacefondOut = NULL;
    initText();

}

 void Bouton::initText(){
     if(policeTTF != NULL && texte != NULL && texte[0] != '\0'){
        SDL_FreeSurface(textIn);
        SDL_FreeSurface(textOut);

        textIn = TTF_RenderText_Blended(policeTTF, texte, in);
        textOut = TTF_RenderText_Blended(policeTTF, texte, out);
        texteAfficher = textOut;
     }else{
        textIn = NULL;
        textOut = NULL;
        texteAfficher = NULL;
     }
 }

Bouton::~Bouton()
{
  	SDL_FreeSurface(textIn);
    SDL_FreeSurface(textOut);

    TTF_CloseFont(policeTTF);

    SDL_FreeSurface(SurfacefondIn);
    SDL_FreeSurface(SurfacefondOut);
}

void Bouton::afficher(SDL_Surface *ecran,int x , int y,SDL_Event event)
{
    click = false;

    SDL_Rect taille;
    taille.w = 0;
    taille.h = 0;

    texteAfficher = NULL;
	SurfacefondAct = NULL;
	
    if(textOut != NULL)
    {
        texteAfficher = textOut;
        taille.w = texteAfficher->w;
        taille.h = texteAfficher->h;
    }

    if(SurfacefondOut != NULL)
    {
		SurfacefondAct = SurfacefondOut;
        taille.w = SurfacefondAct->w;
        taille.h = SurfacefondAct->h;
    }

    if(event.motion.x > x && event.motion.x < x+taille.w && event.motion.y > y && event.motion.y < y+taille.h)
    {
        if(textIn != NULL)
            texteAfficher = textIn;

        if(SurfacefondIn != NULL)
            SurfacefondAct = SurfacefondIn;

        if(event.type == SDL_MOUSEBUTTONDOWN)
            click = true;

    }

	SDL_Rect position;
	position.x = x;
	position.y = y;

   	if(SurfacefondAct != NULL){
		SDL_BlitSurface(SurfacefondAct,NULL,ecran,&position);
   	}

   	if(SurfacefondAct != NULL && texteAfficher != NULL){
   		position.x += SurfacefondAct->w/2 - texteAfficher->w/2;
   		position.y += SurfacefondAct->h/2 - texteAfficher->h/2;
   	}
   	
    if(texteAfficher != NULL)
        SDL_BlitSurface(texteAfficher,NULL,ecran,&position);

}

bool Bouton::isClicked()
{
    return click;
}


int Bouton::w()
{   
	if(SurfacefondAct != NULL )
        return SurfacefondAct->w;

    if(texteAfficher != NULL)
        return texteAfficher->w;

    return 0;
}
int Bouton::h()
{
	if(SurfacefondAct != NULL )
        return SurfacefondAct->h;

    if(texteAfficher != NULL)
        return texteAfficher->h;

    return 0;
}
void Bouton::setTexte(char* txt)
{
    texte = txt;
    initText();
}
void Bouton::setClick(bool i)
{
    click = i;
}

void Bouton::setFondIn(FondBouton * fond){
    SDL_FreeSurface(SurfacefondIn);
    if(fond != NULL && fond->image !=NULL)
    {
    	int largText = 0;
		if(textIn != NULL)
			largText = textIn->w  ;
		
    	SurfacefondIn = SDL_CreateRGBSurface(SDL_HWSURFACE , fond->largeurDroite + fond->largeurGauche + largText , fond->image->h , 32, 0, 0, 0, 0) ;
		SDL_FillRect(SurfacefondIn , NULL, SDL_MapRGB(SurfacefondIn->format, 255 , 255 , 255));
		SDL_SetColorKey(SurfacefondIn, SDL_SRCCOLORKEY, SDL_MapRGB(SurfacefondIn->format, 255 , 255 , 255));

        SDL_Rect positionFond;
        positionFond.x = 0;
        positionFond.y = 0;
        
        SDL_Rect posImage ;
        posImage.x = 0 ;
        posImage.y = 0;
        posImage.w = fond->largeurGauche;
        posImage.h = fond->image->h;

        SDL_BlitSurface(fond->image,&posImage,SurfacefondIn,&positionFond);

        posImage.x += fond->largeurGauche;
        posImage.w = fond->image->w - fond->largeurGauche - fond->largeurDroite;
        //on va faire une boucle pour afficher le fond autant de foi qu'il faut
        positionFond.x += fond->largeurGauche;

        for(int i = 0 ; i < largText ; i+=posImage.w)
        {
            SDL_BlitSurface(fond->image,&posImage,SurfacefondIn,&positionFond);
            positionFond.x += posImage.w ;
        }
      

        posImage.x += posImage.w;
        posImage.w = fond->largeurDroite;
		positionFond.x = SurfacefondIn->w - fond->largeurDroite ;
		
        SDL_BlitSurface(fond->image,&posImage,SurfacefondIn,&positionFond);
   }else
   		SurfacefondIn = NULL;
}

void Bouton::setFondOut(FondBouton * fond){
   	SDL_FreeSurface(SurfacefondOut);
    if(fond != NULL && fond->image !=NULL)
    {
    	int largText = 0;
		if(textOut != NULL)
			largText = textOut->w ;
		
    	
    	SurfacefondOut = SDL_CreateRGBSurface(SDL_HWSURFACE , fond->largeurDroite + fond->largeurGauche + largText  , fond->image->h , 32, 0, 0, 0, 0) ;
		SDL_FillRect(SurfacefondOut , NULL, SDL_MapRGB(SurfacefondOut->format, 255 , 255 , 255));
		SDL_SetColorKey(SurfacefondOut, SDL_SRCCOLORKEY, SDL_MapRGB(SurfacefondOut->format, 255 , 255 , 255));

        SDL_Rect positionFond;
        positionFond.x = 0;
        positionFond.y = 0;
        
        SDL_Rect posImage ;
        posImage.x = 0 ;
        posImage.y = 0;
        posImage.w = fond->largeurGauche;
        posImage.h = fond->image->h;

        SDL_BlitSurface(fond->image,&posImage,SurfacefondOut,&positionFond);

        posImage.x += fond->largeurGauche;
        posImage.w = fond->image->w - fond->largeurGauche - fond->largeurDroite;
        //on va faire une boucle pour afficher le fond autant de foi qu'il faut
        positionFond.x += fond->largeurGauche;

        for(int i = 0 ; i < largText ; i+=posImage.w)
        {
            SDL_BlitSurface(fond->image,&posImage,SurfacefondOut,&positionFond);
            positionFond.x += posImage.w ;
        }

        posImage.x += posImage.w;
        posImage.w = fond->largeurDroite;
		positionFond.x = SurfacefondOut->w - fond->largeurDroite ;
		
        SDL_BlitSurface(fond->image,&posImage,SurfacefondOut,&positionFond);
   }else
   		SurfacefondOut = NULL;
}

void Bouton::setColorIn(SDL_Color in )
{
    this->in = in;
    initText();
}

void Bouton::setColorOut(SDL_Color out)
{
    this->out = out;
    initText();
}
